import java.util.HashSet;
import java.util.Set;

public class GetIntersectionNode {
    /**
     * 思路：
     * 方法一、HashSet
     * 1.将链表A放入哈希集合
     * 2.遍历链表B，看哈希集合中有没有key
     * HashSet 只有 key，没有 value；HashMap 有 key 和 value，是映射结构。
     * HashSet 实际上是基于 HashMap 实现的，它把值都映射成一个固定的哨兵对象（如 PRESENT）。
     */

    public ListNode getIntersectionNode(ListNode headA,ListNode headB){
        Set<ListNode> visited = new HashSet<ListNode>();
        ListNode temp = headA;
        while(temp != null){
            visited.add(temp);
            temp = temp.next;
        }

        temp = headB;
        while(temp != null){
            if(visited.contains(temp)){
                return temp;
            }
            temp = temp.next;
        }
        return null;
    }

    /**
     * 方法二、双链表
     * 思路：
     * 1.相交：指针A移动了a+c+b，指针B移动了b+c+a后，会停在第一个相交点，所以，若A先走完，则到B的开头走；
     * 2.不相交：A走完走B，B走完走A，最后两个同时到达null
     */
    public ListNode getIntersectionListNode(ListNode headA, ListNode headB){
        if(headA == null || headB == null){
            return null;
        }
        ListNode pA = headA, pB = headB;
        while(pA != pB){
            pA = pA == null ? headB : pA.next;
            pB = pB == null ? headA : pB.next;
        }
        return pA;
    }



    public class ListNode{
        int val;
        ListNode next;

        public ListNode(int val){
            this.val = val;
            this.next = null;
        }
    }
}
